﻿/* ***********************************************
 * Author		:  kingthy
 * Email		:  kingthy@gmail.com
 * Description	:  与微博相关的接口实现
 *
 * ***********************************************/

using System;
using System.Collections.Generic;
using System.Text;
using OpenTwitter.SDK.Sina.Objects;
using OpenTwitter.SDK.Http;

namespace OpenTwitter.SDK.Sina.API
{
    /// <summary>
    /// 与微博相关的接口实现
    /// </summary>
    public class Twitter
        : APIRequest
    {
        /// <summary>
        /// 根据授权对象实例化
        /// </summary>
        /// <param name="oauth"></param>
        public Twitter(OAuth oauth)
            : base(oauth)
        { }

        #region 获取一条微博数据
        /// <summary>
        /// 采用默认API请求地址获取一条微博数据
        /// </summary>
        /// <param name="id">微博id</param>
        /// <returns>获取一条微博数据.</returns>
        public TweetData GetTweet(long id)
        {
            return this.GetTweet("http://api.t.sina.com.cn/statuses/show/{0}", id);
        }
        /// <summary>
        /// 获取一条微博数据
        /// </summary>
        /// <param name="requestUrl">API请求地址. 地址中可以用“{0}”标记id的值</param>
        /// <param name="id">微博id</param>
        /// <returns>获取一条微博数据.</returns>
        public TweetData GetTweet(string requestUrl, long id)
        {
            this.Clear();
            requestUrl = string.Format(requestUrl, id);
            return this.GetResponseData<TweetData>(requestUrl);
        }
        #endregion

        #region 发表一条微博
        /// <summary>
        /// 采用默认API请求地址发表一条微博
        /// </summary>
        /// <param name="content">微博内容</param>
        /// <returns></returns>
        public TweetData Add(TweetContent content)
        {
            if (content == null) throw new ArgumentNullException("content");
            string requestUrl = content.HasImage ? "http://api.t.sina.com.cn/statuses/upload" : "http://api.t.sina.com.cn/statuses/update";
            return this.Add(requestUrl, content);
        }
        /// <summary>
        /// 采用默认API请求地址发表一条微博
        /// </summary>
        /// <param name="content">微博内容</param>
        /// <returns>发表结果</returns>
        public TweetData Add(string content)
        {
            return this.Add(content, string.Empty);
        }
        /// <summary>
        /// 采用默认API请求地址发表一条带图片的微博
        /// </summary>
        /// <param name="content">微博内容</param>
        /// <param name="image">附加的图片文件，可以为本地文件绝对地址(c:\files\test.jpg)，也可以为网络文件绝对地址(http://www.domain.com/files/test.jpg)</param>
        /// <returns>发表结果</returns>
        public TweetData Add(string content, string image)
        {
            TweetContent tc = new TweetContent(content);
            if (!string.IsNullOrEmpty(image))
            {
                tc.Image = new UploadFile(image);
            }
            return this.Add(tc);
        }
        /// <summary>
        /// 发表一条微博
        /// </summary>
        /// <param name="requestUrl">API请求地址</param>
        /// <param name="content">微博内容</param>
        /// <returns>发表结果</returns>
        public TweetData Add(string requestUrl, TweetContent content)
        {
            this.Clear();
            this.Parameters.Add("status", content.Text);
            if (content.HasLatAndLong)
            {
                this.Parameters.Add("lat", content.Lat);
                this.Parameters.Add("long", content.Long);
            }

            if (content.HasImage)
            {
                this.Files.Add("pic", content.Image);
            }
            return this.GetResponseData<TweetData>(RequestMethod.POST, requestUrl);
        }
        #endregion

        #region 删除一条微博数据
        /// <summary>
        /// 采用默认API请求地址删除一条微博数据
        /// </summary>
        /// <param name="id">微博id</param>
        /// <returns>微博数据.</returns>
        public TweetData Delete(long id)
        {
            return this.GetTweet("http://api.t.sina.com.cn/statuses/destroy/{0}", id);
        }
        /// <summary>
        /// 删除一条微博数据
        /// </summary>
        /// <param name="requestUrl">API请求地址. 地址中可以用“{0}”标记id的值</param>
        /// <param name="id">微博id</param>
        /// <returns>微博数据.</returns>
        public TweetData Delete(string requestUrl, long id)
        {
            this.Clear();
            requestUrl = string.Format(requestUrl, id);
            return this.GetResponseData<TweetData>(RequestMethod.POST, requestUrl);
        }
        #endregion

        #region 转播一条微博
        /// <summary>
        /// 采用默认API请求地址转播一条微博
        /// </summary>
        /// <param name="id">转播的微博id</param>
        /// <param name="content">微博内容</param>
        /// <param name="iscomment">是否在转发的同时发表评论。0表示不发表评论，1表示发表评论给当前微博，2表示发表评论给原微博，3是1、2都发表。默认为0。 </param>
        /// <returns>转播后的微博数据</returns>
        public TweetData Repost(long id, string content, PostCommentType iscomment)
        {
            return this.Repost("http://api.t.sina.com.cn/statuses/repost", id, content, iscomment);
        }
        /// <summary>
        /// 转播一条微博
        /// </summary>
        /// <param name="requestUrl">API请求地址</param>
        /// <param name="id">转播的微博id</param>
        /// <param name="content">微博内容</param>
        /// <param name="iscomment">是否在转发的同时发表评论。0表示不发表评论，1表示发表评论给当前微博，2表示发表评论给原微博，3是1、2都发表。默认为0。 </param>
        /// <returns>转播后的微博数据</returns>
        public TweetData Repost(string requestUrl, long id, string content, PostCommentType iscomment)
        {
            this.Clear();
            this.Parameters.Add("status", content);
            this.Parameters.Add("id", id);
            this.Parameters.Add("is_comment", (byte)iscomment);
            return this.GetResponseData<TweetData>(RequestMethod.POST, requestUrl);
        }
        #endregion
    }
}
